# Insurance in case a gem needed by one of our releases gets yanked from
# rubygems.org in the future.
cache gems:
  extends:
    - .default-retry
    - .ruby-cache
    - .default-before_script
    - .setup:rules:cache-gems
  stage: prepare
  needs: []
  variables:
    BUNDLE_WITHOUT: ""
    BUNDLE_WITH: "production:development:test"
    SETUP_DB: "false"
  script:
    - echo -e "\e[0Ksection_start:`date +%s`:bundle-package[collapsed=true]\r\e[0KPackaging gems"
    - bundle config set cache_all true
    - run_timed_command "bundle package --all-platforms"
    - echo -e "\e[0Ksection_end:`date +%s`:bundle-package\r\e[0K"
  artifacts:
    paths:
      - vendor/cache
    expire_in: 31d

.predictive-job:
  extends:
    - .default-retry
  needs: []

.absolutely-predictive-job:
  extends:
    - .predictive-job
  image: ${GITLAB_DEPENDENCY_PROXY_ADDRESS}alpine:edge
  variables:
    GIT_STRATEGY: none

dont-interrupt-me:
  extends:
    - .absolutely-predictive-job
    - .setup:rules:dont-interrupt-me
  stage: sync
  interruptible: false
  script:
    - echo "This jobs makes sure this pipeline won't be interrupted! See https://docs.gitlab.com/ee/ci/yaml/#interruptible."

gitlab_git_test:
  extends:
    - .predictive-job
    - .setup:rules:gitlab_git_test
  stage: test
  script:
    - spec/support/prepare-gitlab-git-test-for-commit --check-for-changes

verify-ruby-3.0:
  extends:
    - .absolutely-predictive-job
    - .setup:rules:verify-ruby-3.0
  stage: prepare
  script:
    - echo 'Please remove label ~"pipeline:run-in-ruby3_1" so we do test against Ruby 3.0 (default version) before merging the merge request'
    - exit 1

verify-tests-yml:
  extends:
    - .setup:rules:verify-tests-yml
  image: ${GITLAB_DEPENDENCY_PROXY_ADDRESS}ruby:${RUBY_VERSION}-alpine3.16
  stage: test
  needs: []
  script:
    - source scripts/utils.sh
    - install_tff_gem
    - scripts/verify-tff-mapping

verify-approvals:
  extends:
    - .predictive-job
    - .setup:rules:jh-contribution
  script:
    - source scripts/utils.sh
    - install_gitlab_gem
    - tooling/bin/find_app_sec_approval

generate-frontend-fixtures-mapping:
  extends:
    - .setup:rules:generate-frontend-fixtures-mapping
    - .use-pg14
    - .ruby-cache
  needs: ["setup-test-env"]
  stage: prepare
  before_script:
    - !reference [.default-before_script, before_script]
    - source ./scripts/rspec_helpers.sh
    - section_start "gitaly-test-spawn" "Spawning Gitaly"; scripts/gitaly-test-spawn; section_end "gitaly-test-spawn";  # Do not use 'bundle exec' here
  script:
    - generate_frontend_fixtures_mapping
  artifacts:
    expire_in: 7d
    paths:
      - ${FRONTEND_FIXTURES_MAPPING_PATH}

detect-tests:
  extends: .rails:rules:detect-tests
  image: ${GITLAB_DEPENDENCY_PROXY_ADDRESS}ruby:${RUBY_VERSION}-slim
  needs: []
  stage: prepare
  variables:
    RSPEC_TESTS_MAPPING_ENABLED: "true"
  before_script:
    - apt-get update && apt-get install -y curl  # Not present in ruby-slim, so we add it manually
  script:
    - source ./scripts/utils.sh
    - source ./scripts/rspec_helpers.sh
    - install_gitlab_gem
    - install_tff_gem
    - install_activesupport_gem
    - retrieve_tests_mapping
    - retrieve_frontend_fixtures_mapping
    - |
      if [ -n "$CI_MERGE_REQUEST_IID" ]; then
        mkdir -p $(dirname "$RSPEC_CHANGED_FILES_PATH")

        tooling/bin/predictive_tests

        filter_rspec_matched_foss_tests ${RSPEC_MATCHING_TESTS_PATH} ${RSPEC_MATCHING_TESTS_FOSS_PATH};
        filter_rspec_matched_ee_tests ${RSPEC_MATCHING_TESTS_PATH} ${RSPEC_MATCHING_TESTS_EE_PATH};

        echoinfo "Changed files: $(cat $RSPEC_CHANGED_FILES_PATH)";
        echoinfo "Related FOSS RSpec tests: $(cat $RSPEC_MATCHING_TESTS_FOSS_PATH)";
        echoinfo "Related EE RSpec tests: $(cat $RSPEC_MATCHING_TESTS_EE_PATH)";
        echoinfo "Related JS files: $(cat $RSPEC_MATCHING_JS_FILES_PATH)";
      fi
  artifacts:
    expire_in: 7d
    paths:
      - ${FRONTEND_FIXTURES_MAPPING_PATH}
      - ${RSPEC_CHANGED_FILES_PATH}
      - ${RSPEC_MATCHING_JS_FILES_PATH}
      - ${RSPEC_MATCHING_TESTS_EE_PATH}
      - ${RSPEC_MATCHING_TESTS_FOSS_PATH}
      - ${RSPEC_MATCHING_TESTS_PATH}
      - ${RSPEC_VIEWS_INCLUDING_PARTIALS_PATH}

detect-previous-failed-tests:
  extends:
    - detect-tests
    - .rails:rules:detect-previous-failed-tests
  variables:
    PREVIOUS_FAILED_TESTS_DIR: tmp/previous_failed_tests/
  script:
    - source ./scripts/utils.sh
    - source ./scripts/rspec_helpers.sh
    - retrieve_failed_tests "${PREVIOUS_FAILED_TESTS_DIR}" "oneline" "previous"
  artifacts:
    expire_in: 7d
    paths:
      - ${PREVIOUS_FAILED_TESTS_DIR}

e2e-test-pipeline-generate:
  extends:
    - .qa-job-base
    - .predictive-job
    - .qa:rules:determine-e2e-tests
  stage: prepare
  variables:
    ENV_FILE: $CI_PROJECT_DIR/qa_tests_vars.env
    COLORIZED_LOGS: "true"
  script:
    - bundle exec rake "ci:detect_changes[$ENV_FILE]"
    - cd $CI_PROJECT_DIR && scripts/generate-e2e-pipeline
  artifacts:
    expire_in: 1 day
    paths:
      - '*-pipeline.yml'
      - "${CI_PROJECT_DIR}/qa_tests_vars.env"

trigger-omnibus-env:
  stage: prepare
  extends:
    - .qa:rules:trigger-omnibus-env
  needs:
    # We need this job because we need its `cached-assets-hash.txt` artifact, so that we can pass the assets image tag to the downstream omnibus-gitlab pipeline.
    - compile-production-assets
  variables:
    BUILD_ENV: build.env
  before_script:
    - source scripts/utils.sh
  script:
    # Note that OMNIBUS_GITLAB_CACHE_UPDATE is not used in the code, but it is actually used in the 2-hourly maintenance pipeline schedule.
    - |
      SECURITY_SOURCES=$([[ ! "$CI_PROJECT_NAMESPACE" =~ ^gitlab-org\/security ]] || echo "true")
      echo "SECURITY_SOURCES=${SECURITY_SOURCES:-false}" > $BUILD_ENV
      echo "OMNIBUS_GITLAB_CACHE_UPDATE=${OMNIBUS_GITLAB_CACHE_UPDATE:-false}" >> $BUILD_ENV
      for version_file in *_VERSION; do echo "$version_file=$(cat $version_file)" >> $BUILD_ENV; done
      echo "OMNIBUS_GITLAB_BUILD_ON_ALL_OS=${OMNIBUS_GITLAB_BUILD_ON_ALL_OS:-false}" >> $BUILD_ENV
      echo "USE_OLD_RUBY_VERSION=${USE_OLD_RUBY_VERSION:-false}" >> $BUILD_ENV
      echo "NEXT_RUBY_VERSION=${NEXT_RUBY_VERSION}" >> $BUILD_ENV
      echo "GITLAB_ASSETS_TAG=$(assets_image_tag)" >> $BUILD_ENV
      echo "EE=$([[ $FOSS_ONLY == '1' ]] && echo 'false' || echo 'true')" >> $BUILD_ENV
      target_branch_name="${CI_MERGE_REQUEST_TARGET_BRANCH_NAME:-${CI_COMMIT_REF_NAME}}"
      echo "TRIGGER_BRANCH=$([[ "${target_branch_name}" =~ ^[0-9-]+-stable(-ee)?$ ]] && echo ${target_branch_name%-ee} || echo 'master')" >> $BUILD_ENV
    - |
      echo "Built environment file for omnibus build:"
      cat $BUILD_ENV
  artifacts:
    expire_in: 3 days
    reports:
      dotenv: $BUILD_ENV
    paths:
      - $BUILD_ENV

trigger-omnibus-env as-if-foss:
  extends:
    - trigger-omnibus-env
    - .qa:rules:package-and-test-ce
  needs:
    - compile-production-assets as-if-foss
  variables:
    FOSS_ONLY: "1"
